#include <stdio.h>

/**
 * 
 * LEETCODE Q7 Reverse Integer
 * Given a 32-bit signed integer, reverse digits of an integer
 * 
 * 思路：
    * M1 ：字符串转换 + trycatch 
    * M2 : 数字运算 % /
 * 
 * 易错点：
    * 确立数字计算的思路后 得出返回值的式子应为res = res * 10 + （x/10) ; 然后应在该式执行前 先进行溢出判断 ;也就是看res * 10 + (x/10) 是否会大于INTMAX 或小于 INTMIN
    * 此处我犯了一个错误
    * 直接将 res * 10 + (x/10) > INTMAX 转换为 res > (INTMAX - X/10) / 10；
    * ***********忽略了计算机运算中 乘法和除法非可逆运算这一事实***********
 * 
 * tips:
    * 取模运算和取余运算 是在没有堆栈辅助时 将数字依次弹出和推入的方法
    * 对负数取模/余运算  均得到一个负数
 * 
*/

int reverse(int x){
    if( x == 0 ) return 0;
    int min = -__INT_MAX__ - 1;
    int max = __INT_MAX__;
    int res = 0;
    int mo;
    while( x != 0 ){
        mo = x % 10;
        x = x / 10;
        if(res > max / 10 || (res == max / 10) && mo > 7) return 0;
        if(res < min / 10 || (res == min / 10) && mo < -8) return 0;
        res = res * 10 + mo;
    }
    return res;
}

int main(){
    int a = 1463847412;
    printf("%d",reverse(a));
    return 0;
}